package com.xiaoxiaoniu.airoleplay.services;

import com.xiaoxiaoniu.airoleplay.model.Conversation;
import com.xiaoxiaoniu.airoleplay.repository.ConversationRepository;
import com.xiaoxiaoniu.airoleplay.repository.MessageRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import com.xiaoxiaoniu.airoleplay.model.Message;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * 会话服务类
 * 提供会话和消息的业务逻辑处理
 */
@Service
public class ConversationService {

    @Autowired
    private ConversationRepository conversationRepository;

    @Autowired
    private MessageRepository messageRepository;

    /**
     * 创建新的会话
     * 
     * @param roleName 角色名称
     * @return 会话ID
     */
    public String createNewConversation(String roleName) {
        String conversationId = generateConversationId();

        Conversation conversation = new Conversation();
        conversation.setConversationId(conversationId);
        conversation.setRoleName(roleName);

        conversationRepository.save(conversation);
        return conversationId;
    }

    /**
     * 根据会话ID获取会话信息
     * 
     * @param conversationId 会话ID
     * @return 包含会话的Optional对象
     */
    public Optional<Conversation> getConversation(String conversationId) {
        return conversationRepository.findByConversationId(conversationId);
    }

    /**
     * 获取所有会话列表，按更新时间降序排列
     * 
     * @return 会话列表
     */
    public List<Conversation> getAllConversations() {
        return conversationRepository.findAllOrderByUpdatedAtDesc();
    }

    /**
     * 根据角色名称获取会话列表，按更新时间降序排列
     * 
     * @param roleName 角色名称
     * @return 会话列表
     */
    public List<Conversation> getConversationsByRole(String roleName) {
        return conversationRepository.findByRoleNameOrderByUpdatedAtDesc(roleName);
    }

    /**
     * 保存用户消息和AI回复
     * 
     * @param conversationId 会话ID
     * @param role 角色名称
     * @param userMessage 用户消息
     * @param aiResponse AI回复
     */
    public void saveMessage(String conversationId, String role, String userMessage, String aiResponse) {
        Message message = new Message();
        message.setConversationId(conversationId);
        message.setRole(role);
        message.setUserMessage(userMessage);
        message.setAiResponse(aiResponse);

        messageRepository.save(message);

        // 更新会话时间
        conversationRepository.findByConversationId(conversationId).ifPresent(conversation -> {
            conversation.setUpdatedAt(LocalDateTime.now());
            conversationRepository.save(conversation);
        });
    }

    /**
     * 获取指定会话的所有消息，按时间戳升序排列
     * 
     * @param conversationId 会话ID
     * @return 消息列表
     */
    public List<Message> getConversationMessages(String conversationId) {
        return messageRepository.findByConversationIdOrderByTimestampAsc(conversationId);
    }

    /**
     * 获取指定会话的最新消息
     * 
     * @param conversationId 会话ID
     * @param limit 消息数量限制
     * @return 消息列表
     */
    public List<Message> getLatestMessages(String conversationId, int limit) {
        return messageRepository.findLatestByConversationId(conversationId,
                PageRequest.of(0, limit));
    }

    /**
     * 统计指定会话的消息数量
     * 
     * @param conversationId 会话ID
     * @return 消息数量
     */
    public long getMessageCount(String conversationId) {
        return messageRepository.countByConversationId(conversationId);
    }

    /**
     * 生成会话ID
     * 改进的策略使会话ID更具可读性和安全性：
     * 1. 使用前缀+角色标识+时间戳+随机字符串的格式
     * 2. 添加时间信息便于追踪
     * 3. 增加随机字符串长度提高安全性
     * 
     * @return 会话ID
     */
    private String generateConversationId() {
        // 获取当前时间的ISO格式，去掉特殊字符
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        // 生成更长的随机字符串部分
        String randomPart = UUID.randomUUID().toString().replace("-", "").substring(0, 12);
        // 组合格式：前缀_时间戳_随机字符串
        return "conv_" + timestamp + "_" + randomPart;
    }
}